/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package redinftel.sesiones;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import redinftel.entidades.Amistad;
import redinftel.entidades.Publicacion;
import redinftel.entidades.Usuario;
import redinftel.utilidades.ComparablePublicacion;


/**
 * Clase para el manejo de datos de la entidad Publicacion.
 * @author Six Degrees Team
 */
@Stateless
public class PublicacionFacade extends AbstractFacade<Publicacion> implements PublicacionFacadeRemote {

    @EJB
    private AmistadFacadeRemote amistadFacade;
    @PersistenceContext(unitName = "redinftel-ejbPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public PublicacionFacade() {
        super(Publicacion.class);
    }

    @Override
    public List<String> findPK() {
        return em.createQuery("SELECT p.idPublicacion FROM Publicacion p").getResultList();
    }

    @Override
    public List<Publicacion> findPublicacionesDeUsuario(Usuario usuarioDestino) {
        return em.createQuery("SELECT p FROM Publicacion p WHERE p.usuario = ?1 ORDER BY p.fecha DESC").setParameter(1, usuarioDestino).getResultList();
    }

    @Override
    public List<Publicacion> find10UltimasPublicaciones(Usuario yo) {
        // obtengo mis amigos
        Set<Usuario> listaAmigos = new HashSet();
        for (Amistad a : yo.getAmistadCollection()) {
            if (!a.getIdAmigo1().equals(yo) && a.getEstado().equals("CONFIRMADA")) {
                listaAmigos.add(a.getIdAmigo1());
            }
            if (!a.getIdAmigo2().equals(yo) && a.getEstado().equals("CONFIRMADA")) {
                listaAmigos.add(a.getIdAmigo2());
            }
        }
        for (Amistad a : yo.getAmistadCollection1()) {
            if (!a.getIdAmigo1().equals(yo) && a.getEstado().equals("CONFIRMADA")) {
                listaAmigos.add(a.getIdAmigo1());
            }
            if (!a.getIdAmigo2().equals(yo) && a.getEstado().equals("CONFIRMADA")) {
                listaAmigos.add(a.getIdAmigo2());
            }
        }

        //obtengo las 10 últimas publicaciones de mis amigos
        List<Publicacion> publicacionesAmigos = new ArrayList<Publicacion>();
        for (Usuario u : listaAmigos) {
            publicacionesAmigos.addAll(em.createQuery("SELECT p FROM Publicacion p WHERE p.usuario = ?1 Order by p.fecha DESC").setParameter(1, u).setMaxResults(10).getResultList());
        }

        List<Publicacion> publicacionesFiltrada = new ArrayList<Publicacion>();
        for (Publicacion p : publicacionesAmigos) {
            if (listaAmigos.contains(p.getUsuario())) {
                publicacionesFiltrada.add(p);
            }
        }

        //obtengo mis 10 últimos publicaciones
        List<Publicacion> publicacionesMias = new ArrayList<Publicacion>();
        publicacionesMias.addAll(em.createQuery("SELECT p FROM Publicacion p WHERE (p.usuario = ?1 OR p.usuario1 = ?1) Order by p.fecha DESC").setParameter(1, yo).setMaxResults(10).getResultList());

        List<Publicacion> publicacionTotal = new ArrayList<Publicacion>();
        publicacionTotal.addAll(publicacionesMias);
        publicacionTotal.addAll(publicacionesFiltrada);
        List<ComparablePublicacion> res= new ArrayList<ComparablePublicacion>();
        for(Publicacion p : publicacionTotal){
            res.add(new ComparablePublicacion(p));

        }
        Collections.sort(res);

        List<Publicacion> totalDeVerdad = new ArrayList<Publicacion>();
        int i = 0;
        while(i<10 && i<res.size()){
            totalDeVerdad.add(res.get(i).getComentario());
            i++;
        }

        return totalDeVerdad;
    }
}
